#ifndef _Szachownica_h_
#define _Szachownica_h_

#include "Singleton.h"
#include "Pole.h"
#include <string>
#include <time.h>
#include <vector>
#include <fstream>
#include <typeinfo>

using std::vector;
using std::string;

typedef vector<pole> wektor; //tak zeby ladnie wygladalo 
typedef vector<wektor> macierz;

class Szachownica : public Singleton <Szachownica>
{

public:
	Szachownica();
	~Szachownica(); //nie jest wymagany, system i tak zrobi to za nas, ale chce miec lepsza kontrole nad aplikacja
	void wygeneruj_stan_poczatkowy();


	const size_t WyrzucFigure(const int i, const int j) const ;
	const bool WyrzucKolor(const int i, const int j) const;
	const pole WyrzucStan(const int i, const int j) const;
	
	void ZapiszGre();
	void WczytajGre();
	void WykonajRuch(const size_t pozycja_startowa_x, const size_t pozycja_startowa_y, const size_t pozycja_koncowa_x, const size_t pozycja_koncowa_y);
	//metody odpowiedzialne za wykonywanie logu, maja dodane informacje o czasie (dzien i godzina)
	const bool SprawdzPoprawnoscRuchu(const size_t pozycja_startowa_x, const size_t pozycja_startowa_y, const size_t pozycja_koncowa_x, const size_t pozycja_koncowa_y, const bool kolor);
	std::string ZwrocNazweGracza(); 
	const size_t ZwrocIloscElementowWKontenerzeNaZbiteFigury(const bool bialy_kolor) const;
	const size_t ZwrocTypFiguryZnajdujacejSieWKontenerzeNaZbiteFigury(const bool bialy_kolor, const size_t pozycja) const;
	const bool ZwrocKolorFiguryZnajdujacejSieWKontenerzeNaZbiteFigury(const bool bialy_kolor, const size_t pozycja) const;
	const bool SprawdzCzyGraZakonczona() const;

private:

	std::ofstream zapis_log_graczy; //odczyt wylacznie przy wznowieniu gry
	std::ofstream zapis_log_aplikacji; //nie ma potrzeby zeby aplikacja miala mozliwosc odczytu czegokolwiek z tego pliku

	std::vector <Figura* > Kontener_Zbite_Czarne;
	std::vector <Figura* > Kontener_Zbite_Biale;

	const std::string ZwrocNazweFigury(const Figura* NazwaFigury);
	
	bool RuchGoniec(const size_t _posX , const size_t _posY , const size_t posX, const size_t posY); //za te przecinki to bede chyba bil, palil, mordowal...
	bool RuchHetman(const size_t _posX , const size_t _posY , const size_t posX, const size_t posY);
	bool RuchKon(const size_t _posX , const size_t _posY , const size_t posX, const size_t posY);
	bool RuchKrol(const int _posX , const int _posY , const int posX, const int posY);
	bool RuchWieza(const size_t _posX , const size_t _posY , const size_t posX, const size_t posY);
	bool RuchPionek(const size_t _posX , const size_t _posY , const size_t posX, const size_t posY, const bool kolor, const size_t TypFigury );

	bool SprawdzWieza ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor );
	bool SprawdzKon ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor );
	bool SprawdzKrol ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor );
	bool SprawdzGoniec ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor );
	bool SprawdzHetman ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor );
	bool SprawdzPionek ( const size_t _posX , const size_t _posY , const size_t posX , const size_t posY , const bool kolor , const size_t TypFigury );
	bool _gra_aktywna;
	bool _aktywny_bialy_gracz;
	//dla przypomnienia: _posX i _posY to pozycje poczatkowe figury a posX i posY to koncowe

	void UtworzFigureWedlugTypu(const size_t pozycja_x, const size_t pozycja_y, const size_t typ, const bool kolor);
	void UtworzFigureWedlugTypuIUmiescWKontenerzeNaZbite(const size_t typ, const bool kolor);
	void ZmienGracza();
	void ZbijFigure(const size_t pozycja_x, const size_t pozycja_y);
	void WyslijDoLoguAplikacji(std::string komunikat); //tylko informacje techniczne, jak uruchomienie/zamkniecie aplikacji, ew problemy
	void WyslijDoLoguGracza(std::string komunikat); //warto by dodac tutaj strumien ktory bedzie mial ujscie w SDLowym okienku, w jednej metodzie miec zalatwiony zapis do pliku i wyswietlanie na ekran


	macierz szachownica; //po szachownicy poruszamy sie w sposob: szachownica[0-7][0-7] 
	wektor wiersz; //
	

};

#endif